/*
 * Q16.h
 *
 * 		Q16.16 fixed point number representation helper macros
 *
 */

#ifndef Q16_H_
#define Q16_H_

typedef int32_t fx_t;

#define FX_FRAC 16

#define fx_float(a) 			(a / (float)(1<<FX_FRAC))				// convert Q16 to float
#define fx_make(a)  			((fx_t)(a * (1<<FX_FRAC)))				// make Q16
#define fx_add(a,b) 			(a + b)									// add two Q16s
#define fx_sub(a,b) 			(a - b)									// subtract two Q16s
#define fx_mul(a,b) 			((fx_t)(((int64_t)a * b) >> FX_FRAC))	// multiply two Q16s
#define fx_div(a,b) 			((fx_t)(((int64_t)a << FX_FRAC) / b))	// divide two Q16s
#define fx_get_fraction(a)		(a & 0xffff)							// just leave fractional part of Q16
#define fx_trunc_to_int32(a)	(a / (1<<FX_FRAC))						// truncate Q16 to int32, discarding fraction

#endif /* Q16_H_ */
